/**
 * Title: DownloadManager.java
 * Description:
 * Copyright: Copyright (c) 2008
 * Company:深圳彩讯科技有限公司
 * Author 罗旭东 (hi@luoxudong.com)
 * Date 2013-9-24 下午3:26:50
 * Version 1.0
 */
package com.luoxudong.phonenumber.service.net.http.filetransfer.manager;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

import com.luoxudong.phonenumber.service.net.http.filetransfer.vo.TransferStatus;

/** 
 * ClassName: DownloadManager
 * Description:下载队列管理
 * Create by 罗旭东
 * Date 2013-9-24 下午3:26:50
 */
public class DownloadManager {
	/**
	 * 每次开启下载任务个数
	 */
	private static final int OPEN_TASK_NUM_ONCE = 5;
	
	/**
	 * 下载任务队列
	 */
	private static List<FileTransferTask> downloadTaskList = new CopyOnWriteArrayList<FileTransferTask>();
	
	/**
	 * 正在下载的任务
	 */
	private static List<FileTransferTask> downloadingTaskList = new CopyOnWriteArrayList<FileTransferTask>();
	
	/**
	 * 添加下载任务到下载队列
	 * @param fileTransferTask 文件下载任务
	 */
	public static void addDownloadTask(FileTransferTask fileTransferTask)
	{
		checkDownloadTaskList();
		
		synchronized (downloadTaskList) {
			if (!downloadTaskList.contains(fileTransferTask))
			{
				downloadTaskList.add(fileTransferTask);
			}
			
			//当前没有任务在下载，则触发下载任务
			if (downloadingTaskList.size() == 0)
			{
				startDownloadQueue();
			}
		}
	}
	
	/**
	 * 从下载列表中查找指定下载任务
	 * @param downloadId 下载ID
	 * @return 结果下载任务
	 */
	public static FileTransferTask findDownloadTask(int downloadId)
	{
		checkDownloadTaskList();
		
		synchronized (downloadTaskList) {
			for (FileTransferTask fileTransferTask : downloadTaskList)
			{
				if (fileTransferTask.getTransferId() == downloadId)
				{
					return fileTransferTask;
				}
			}
		}
		
		return null;
	}
	
	/**
	 * 获取正在下载任务的ID
	 * @return
	 */
	public static List<Integer> findAllDownloadTaskIds()
	{
		checkDownloadTaskList();
		List<Integer> downloadIds = new ArrayList<Integer>();
		
		synchronized (downloadTaskList) {
			for (FileTransferTask fileTransferTask : downloadTaskList)
			{
				downloadIds.add(fileTransferTask.getTransferId());
			}
		}
		
		return downloadIds;
	}
	
	/**
	 * 检测是否正在下载
	 * @param downloadId
	 */
	public static boolean isDownloading(int downloadId)
	{
		synchronized (downloadingTaskList) {
			if (downloadingTaskList != null)
			{
				for (FileTransferTask fileTransferTask : downloadingTaskList)
				{
					if (fileTransferTask.getTransferId() == downloadId)
					{
						return true;
					}
				}
			}
			
			return false;
		}
	}
	
	/**
	 * 检测下载列表
	 */
	public static void checkDownloadTaskList()
	{
		//列表不存在则初始化
		if (downloadTaskList == null)
		{
			downloadTaskList = new CopyOnWriteArrayList<FileTransferTask>();
		}
		
		if (downloadingTaskList == null)
		{
			downloadTaskList = new CopyOnWriteArrayList<FileTransferTask>();
		}
	}
	
	/**
	 * 从下载列表中删除下载任务，下载完成以后必须调用
	 * @param downloadId 下载任务ID
	 * @return
	 */
	public static boolean removeDownloadTask(int downloadId)
	{
		if (downloadTaskList == null)
		{
			return false;
		}
		
		if (downloadId == -1)
		{
			return false;
		}
		
		synchronized (downloadTaskList) 
		{
			for (FileTransferTask fileTransferTask : downloadTaskList)
			{
				if (fileTransferTask.getTransferId() == downloadId)
				{
					downloadTaskList.remove(fileTransferTask);
					
					if (downloadingTaskList.contains(fileTransferTask))//当前正在下载
					{
						fileTransferTask.cancel();
						downloadingTaskList.remove(fileTransferTask);
					}
					
					//如果还有未下载的任务则开始下载
					for (FileTransferTask ftt : downloadTaskList)
					{
						if (ftt.getTransferStatus() == TransferStatus.ready.getValue())
						{
							downloadingTaskList.add(ftt);
							startDownloadTask(ftt);
						}
						
						if (downloadingTaskList.size() >= OPEN_TASK_NUM_ONCE)
						{
							break;
						}
					}
					
					return true;
				}
			}
		}
		
		return false;
	}
	
	/**
	 * 停止所有下载任务
	 * @return
	 */
	public static int stopAllDownloadTask()
	{
		if (downloadTaskList == null)
		{
			return -1;
		}
		
		synchronized (downloadTaskList) 
		{
			for (FileTransferTask fileTransferTask : downloadTaskList)
			{
				fileTransferTask.cancel();
			}
			
			downloadTaskList.clear();
			downloadingTaskList.clear();
			return 1;
		}
	}
	
	/**
	 * 启动下载队列
	 */
	public static void startDownloadQueue()
	{
		for (FileTransferTask fileTransferTask : downloadTaskList)
		{
			//把正在等待下载的任务加入下载队列中
			if (fileTransferTask.getTransferStatus() == TransferStatus.ready.getValue() && downloadingTaskList.size() < OPEN_TASK_NUM_ONCE)
			{
				startDownloadTask(fileTransferTask);
			}
			
			if (downloadingTaskList.size() >= OPEN_TASK_NUM_ONCE)
			{
				break;
			}
		}
	}
	
	/**
	 * 启动下载任务
	 * @param fileTransferTask
	 */
	private static void startDownloadTask(FileTransferTask fileTransferTask)
	{
		if (!downloadingTaskList.contains(fileTransferTask))
		{
			downloadingTaskList.add(fileTransferTask);
		}
		
		fileTransferTask.setTransferStatus(TransferStatus.working.getValue());
		fileTransferTask.start();
	}
}
